package com.pe.pgn.clubpgn.webapp.controller.periodoprograma;

import java.util.Calendar;
import javax.servlet.http.HttpServletRequest;

import org.joda.time.format.DateTimeFormat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.support.SessionStatus;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.domain.ClpbPrograma;
import com.pe.pgn.clubpgn.domain.ClprPeriodoPrograma;
import com.pe.pgn.clubpgn.service.PeriodoProgramaService;
import com.pe.pgn.clubpgn.service.ProgramaService;
import com.pe.pgn.clubpgn.webapp.controller.BaseFormController;
import com.pe.pgn.clubpgn.webapp.util.CalendarUtil;

/**
 * @author Frank
 * */

@Controller
@RequestMapping("/programa/periodoprograma/**")
public class PeriodoProgramaController extends BaseFormController{

	@Autowired
	private ProgramaService programaService;
	
	@Autowired
	private PeriodoProgramaService periodoProgramaService;
	
	@RequestMapping(value = "/periodoprogramaform.html")
	public String verPeriodoPrograma(@RequestParam(value = "id", required = false) Long idPrograma, 
			HttpServletRequest request,Model modelMap) {
		
		try {
			
			ClprPeriodoPrograma periodoprograma = new ClprPeriodoPrograma();
			periodoprograma.setClpbPrograma(programaService.getProgramaPorID(idPrograma));			
					
			modelMap.addAttribute("periodoprograma"	   	, periodoprograma);
	    	modelMap.addAttribute("periodoliquidacion" 	, periodoProgramaService.periodoliquidacionPorPrograma(idPrograma));
	    	modelMap.addAttribute("periodos"			, periodoProgramaService.finbPeriodos());
	    	modelMap.addAttribute("periodoprograma_date_format", DateTimeFormat.patternForStyle("S-", LocaleContextHolder.getLocale()));
	    	
	    	return "/programa/periodoprograma/periodoprogramaform";
			
		} catch (Exception e) {
			saveError(request, getText("errors.general", request.getLocale()));
			return "/programa/periodoprograma/periodoprogramaform";
		}
	}
	
	@RequestMapping(value = "/eliminarperiodoprograma.html")
	public String eliminarPeriodoPrograma(
	@RequestParam(value = "id", required = false) Long id,
	@RequestParam(value = "idPrograma", required = false) Long idPrograma,
			HttpServletRequest request,Model modelMap) {

		try {

			ClprPeriodoPrograma periodoprograma = periodoProgramaService.findPeriodoProgramaById(id);
			Calendar iniLiq 	 = periodoprograma.getDaFechaInicioLiq();
    		Calendar finLiq 	 = periodoprograma.getDaFechaFinLiq();
    		Calendar currentDate = Calendar.getInstance();
    		
    		if((iniLiq.compareTo(currentDate) < 0 &&
	            finLiq.compareTo(currentDate) > 0) || 
	            iniLiq.compareTo(currentDate) == 0 ||
	            finLiq.compareTo(currentDate) == 0){
    		        	
    			saveError(request, getText("periodoprogramaform.validacionfechaencurso", request.getLocale()));
    			
	        }else if(finLiq.compareTo(currentDate) < 0){
	        	
	        	saveError(request, getText("periodoprogramaform.validacionfechapasada", request.getLocale()));
	        }else{			
	        	periodoProgramaService.eliminarPeriodoPrograma(id);
				saveMessage(request, getText("periodoprogramaform.deleted", request.getLocale()));
		    }
			
			periodoprograma = new ClprPeriodoPrograma();
			periodoprograma.setClpbPrograma(programaService.getProgramaPorID(idPrograma));
					
			modelMap.addAttribute("periodoprograma"	   	, periodoprograma);
	    	modelMap.addAttribute("periodoliquidacion" 	, periodoProgramaService.periodoliquidacionPorPrograma(idPrograma));
	    	modelMap.addAttribute("periodos"			, periodoProgramaService.finbPeriodos());
	    	modelMap.addAttribute("periodoprograma_date_format", DateTimeFormat.patternForStyle("S-", LocaleContextHolder.getLocale()));
			return "/programa/periodoprograma/periodoprogramaform";
			
		} catch (Exception e) {
			
			saveError(request, getText("errors.general", request.getLocale()));
			return "/programa/periodoprograma/periodoprogramaform";
		}
	}
	
	@RequestMapping(value = "/periodoprogramaform.html", method = RequestMethod.POST)
	public String guardarPeriodoPrograma(@ModelAttribute("periodoprograma") ClprPeriodoPrograma periodoprograma,
	BindingResult result, SessionStatus status, HttpServletRequest request,Model modelMap) {
		
		try {
			
			if (result.hasErrors()) {
				return "/programa/periodoprograma/periodoprogramaform";
			}
			
			Long idPrograma = periodoprograma.getClpbPrograma().getId();
			ClprPeriodoPrograma bean  = new ClprPeriodoPrograma();
			ClpbPrograma clpbprograma = programaService.getProgramaPorID(new Long(idPrograma));			
			bean.setClpbPrograma(clpbprograma);
			
			modelMap.addAttribute("periodoprograma_date_format", DateTimeFormat.patternForStyle("S-", LocaleContextHolder.getLocale()));
			modelMap.addAttribute("periodoprograma"	, bean);
			modelMap.addAttribute("periodos" , periodoProgramaService.finbPeriodos());
			modelMap.addAttribute("periodoliquidacion" 	, periodoProgramaService.
			periodoliquidacionPorPrograma(idPrograma));
			
			Calendar fechaInicioLiq   = null;
			Calendar fechaFinLiq	  = null;
			String desFechaInicioLiq  = periodoprograma.getDesFechaInicioLiq();
			String desFechaFinLiq     = periodoprograma.getDesFechaFinLiq();			
			
			try{
				fechaInicioLiq = CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, desFechaInicioLiq);
			}catch(Exception e){
	        	saveError(request, getText("periodoprogramaform.novalidafechainicioliq", request.getLocale()));
	        	return "/programa/periodoprograma/periodoprogramaform";
	        }
			
			try{
				fechaFinLiq = CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, desFechaFinLiq);
			}catch(Exception e){
	        	saveError(request, getText("periodoprogramaform.novalidafechafinliq", request.getLocale()));
	        	return "/programa/periodoprograma/periodoprogramaform";
	        }
			
			
			periodoprograma.setDaFechaInicioLiq(fechaInicioLiq);
			periodoprograma.setDaFechaFinLiq(fechaFinLiq);
			
			///////////////////////////////////////////////////////////////////////////////////
	        //las fechas de liquidacion tienen que estar dentro de las fechas de vigencia
			
	        Calendar daFechaInicioVigencia = clpbprograma.getDaFechaInicioVigencia();
	        Calendar daFechaFinVigencia    = clpbprograma.getDaFechaFinVigencia();	        
	        Calendar daFechaInicioLiq 	   = periodoprograma.getDaFechaInicioLiq();
	        Calendar daFechaFinLiq    	   = periodoprograma.getDaFechaFinLiq();  
	        
	        if((daFechaInicioVigencia.compareTo(daFechaInicioLiq) > 0) ||
	           (daFechaFinVigencia.compareTo(daFechaInicioLiq)    < 0) ||
	           (daFechaInicioVigencia.compareTo(daFechaFinLiq)    > 0) ||
	           (daFechaFinVigencia.compareTo(daFechaFinLiq)       < 0)){
	        	
	        	saveError(request, getText("periodoprogramaform.validacionfechasliq", request.getLocale()));
	        	return "/programa/periodoprograma/periodoprogramaform";
	        }
	        ///////////////////////////////////////////////////////////////////////////////////	                
	        
//	        if(periodoprograma.getClpbPeriodo() != null){
//	        	
//	        	boolean descExists = periodoProgramaService.validarDescripcionPeriodoExiste
//	        	(periodoprograma,clpbprograma);
//	        	
//	        	if(descExists){
//	        		
//	        		saveError(request, getText("periodoprogramaform.periodoexiste", request.getLocale()));
//	        		return "/programa/periodoprograma/periodoprogramaform";
//	        	}
//	        }
	        ///////////////////////////////////////////////////////////////////////////////////
	        
	        String msgError = periodoProgramaService.validarNoTocarPeriodosExistentes
	        (periodoprograma,clpbprograma);
	        
	        if(!"".equals(msgError)){
	        	
	        	saveError(request, getText("periodoprogramaform.periodocruzado", request.getLocale()));       	
	        	return "/programa/periodoprograma/periodoprogramaform";
	        }        
	        ///////////////////////////////////////////////////////////////////////////////////

			
			periodoProgramaService.saveOrUpdatePeriodoPrograma(periodoprograma,clpbprograma);
			saveMessage(request, getText("periodoprogramaform.added", request.getLocale()));			
	    	modelMap.addAttribute("periodoliquidacion" 	, periodoProgramaService.
	    	periodoliquidacionPorPrograma(idPrograma));
	    	
			return "/programa/periodoprograma/periodoprogramaform";
			
		} catch (Exception e) {
			System.out.println(e.getMessage());
			saveError(request, getText("errors.general", request.getLocale()));
			return "/programa/periodoprograma/periodoprogramaform";
		}
	}
}
